package com.eugeneMa.controller;

import com.alibaba.fastjson.JSON;
import com.eugeneMa.common.Constant;
import com.eugeneMa.entity.ClassTime;
import com.eugeneMa.entity.Result;
import com.eugeneMa.enumEntity.DateFormatEnum;
import com.eugeneMa.enumEntity.ErrorMsg;
import com.eugeneMa.service.inter.ClassTimeService;
import com.eugeneMa.util.StringUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

/**
 * 学习铃控制层
 *
 * @author Eugenema
 * @date 2022/3/27 13:34
 */
@Controller
@RequestMapping("/learnBell")
public class LearnBellController {
    /** 日志 */
    private Logger logger = Logger.getLogger(LearnBellController.class);

    /** 课时表Service */
    @Autowired
    ClassTimeService classTimeService;

    /**
     * 跳转学习铃界面
     *
     * @author Eugenema
     * @date 2022/3/27 13:37
     *
     *
     * @return 界面
     **/
    @RequestMapping("/toHomePage")
    public String toHomePage(HttpServletRequest request) {
        try{
            /** 用户ID */
            Integer userId = (Integer)request.getAttribute("userId");

            //获取该用户的所有课时表
            Result result = classTimeService.getClassTimeByUserId(userId);
            request.setAttribute("result", JSON.toJSONStringWithDateFormat(result, DateFormatEnum.DATETIME.getValue()));
            return "/WEB-INF/jsp/learnBell.jsp";
        }catch (Exception e){
            e.printStackTrace();
            logger.error("跳转学习铃界面异常！", e);
            request.setAttribute("errorMsg", ErrorMsg.SYSTEM_ERROR.getContent());
            return "/WEB-INF/jsp/warn/error.jsp";
        }
    }

    /**
     * 获取课时表计划
     *
     * @author Eugenema
     * @date 2022/3/31 22:56
     *
     * @param classTimeId 课时表id
     *
     * @return 课时表计划
     **/
    @RequestMapping("/getClassTimePlan")
    @ResponseBody
    public Result getClassTimePlan(Integer classTimeId) {
        try {
            //校验参数
            if (classTimeId == null) {
                return new Result(false, null, ErrorMsg.PARAM_NULL);
            }

            //获取课时表计划
            return classTimeService.getClassTimePlan(classTimeId);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("获取课时表计划异常！", e);
        }
        return new Result(false, null, ErrorMsg.SYSTEM_ERROR);
    }

    /**
     * 新增/编辑课时表
     *
     * @author Eugenema
     * @date 2022/4/3 18:32
     *
     * @param classTime 课时表数据
     * @param  operation 操作，true编辑/false新增
     *
     * @return 创建结果
     **/
    @RequestMapping("/editClassTime")
    @ResponseBody
    public Result editClassTime(HttpServletRequest request, @RequestBody ClassTime classTime, boolean operation) {
        try{
            /** 用户ID */
            Integer userId = (Integer)request.getAttribute("userId");

            //校验参数
            //1、参数不为空
            if (classTime == null) {
                return new Result(false, null, ErrorMsg.PARAM_NULL);
            }

            //2、字段不为空：描述，学习时长，休息时长，开始时间，上午课时数，上课铃声，下课铃声，午休时长、大课间、预备铃标识、权限
            if (StringUtil.isEmpty(classTime.getDesignation()) || classTime.getLearnMinutes() == null ||
                classTime.getRestMinutes() == null || classTime.getStartTime() == null || classTime.getForenoonNum() == null ||
                classTime.getNoonBreakMinutes() == null || classTime.getGoBellId() == null || classTime.getAfterBellId() == null ||
                classTime.getBigBreak() == null || classTime.getReadyBell() == null || classTime.getAuth() == null) {
                return new Result(false, null, ErrorMsg.PARAM_ERROR);
            }

            //3、上午课时数 > 0，休息时长 > 0，学习时长 > 0，描述字段 <= 15
            if (classTime.getForenoonNum() <= 0 || classTime.getRestMinutes() <= 0 || classTime.getLearnMinutes() <= 0 ||
                    classTime.getDesignation().length() > 15) {
                return new Result(false, null, ErrorMsg.PARAM_ERROR);
            }

            //4、课表总时长不能大于24h：课时数 * 学习时长 + 休息时长
            /** 下午课时数 */
            int afternoonNum = classTime.getAfternoonNum() == null ? 0 : classTime.getAfternoonNum();
            /** 总时长*/
            int totalMinutes = 0;
            /** 是否大课间 */
            boolean bigBreakFlag = Constant.PUBLIC_YES.equals(classTime.getBigBreak());
            /** 是否午休：午休时长 > 休息时长 */
            boolean noonBreakFlag = classTime.getNoonBreakMinutes() > classTime.getRestMinutes();
            /** 是否预备铃 */
            boolean readyBell = Constant.PUBLIC_YES.equals(classTime.getReadyBell());

            //4-1、计算午休时长
            if (noonBreakFlag) {
                //下午课时数 > 0
                if (afternoonNum <= 0) {
                    return new Result(false, null, ErrorMsg.NOONBREAK_CLASSES_NO_ZERO);
                }
            } else {
                //午休时长最少为一个休息时长
                classTime.setNoonBreakMinutes(classTime.getRestMinutes());
            }
            //4-2、计算休息时长
            //计算所有课间：课间数量 = 总课数 - 1
            totalMinutes += ((classTime.getClassNum() - 1) * classTime.getRestMinutes());
            //若开启大课间，则为普通课间加上一个休息时长变为大课间（大课间 = 2 * 休息时长）
            if (bigBreakFlag) {
                //有午休：(上午课时数 / 2 - 1) + (下午课时数 / 2 - 1)
                if (noonBreakFlag) {
                    totalMinutes += ((classTime.getForenoonNum() / 2 + 1) + (afternoonNum / 2 - 1));
                //没有午休：总课时数 / 2 - 1
                } else {
                    totalMinutes += (((classTime.getClassNum()) / 2 - 1) * classTime.getRestMinutes());
                }
            }
            //4-3、计算学习时长：总课时数 * 学习时长
            totalMinutes += classTime.getClassNum() * classTime.getRestMinutes();
            //4-4、计算预备铃，提前十分钟响
            if (readyBell) {
                //需设置预备铃声
                if (classTime.getReadyBellId() == null) {
                    return new Result(false, null, ErrorMsg.PARAM_ERROR);
                }
                totalMinutes += 10;
            }
            //4-5、判断总时长是否超过一天
            if (totalMinutes > Constant.DAY_FULL_MINUTES) {
                return new Result(false, null, ErrorMsg.CLASSTIME_OVERTIME);
            }
            //5、赋值用户id，不信任前端传入的userId
            classTime.setUserId(userId);

            //6、若是编辑课时表，课时表id不为空
            if (operation) {
                if (classTime.getId() == null) {
                    return new Result(false, null, ErrorMsg.PARAM_ERROR);
                }
                return classTimeService.editClassTime(classTime);
            }
            //7、新增课时表
            return classTimeService.addClassTime(classTime);
        }catch (Exception e){
            e.printStackTrace();
            logger.error("新增/编辑课时表异常！", e);
        }
        return new Result(false, null, ErrorMsg.SYSTEM_ERROR);
    }

    /**
     * 删除课时表
     *
     * @author Eugenema
     * @date 2022/4/9 15:18
     *
     * @param classTimeId 课时表ID
     *
     * @return 删除结果
     **/
    @RequestMapping("/deleteClassTime/{classTimeId}")
    @ResponseBody
    public Result deleteClassTime (HttpServletRequest request, @PathVariable Integer classTimeId) {
        try {
            //获取用户ID
            Integer userId = (Integer)request.getAttribute("userId");
            //删除课时表
            return classTimeService.deleteClassTimeById(classTimeId, userId);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("删除课时表异常！", e);
        }
        return new Result(false, null, ErrorMsg.SYSTEM_ERROR);
    }

    /**
     * 判断课时表名称是否重复（以本人创建的课时表为判断依据）
     *
     * @author Eugenema
     * @date 2022/4/16 12:45
     *
     * @param designation 课时表名称
     *
     * @return 若重复，返回true，反之返回false
     **/
    @RequestMapping("/designationSame/{designation}")
    @ResponseBody
    public Result judgeDesignation (HttpServletRequest request, @PathVariable String designation) {
        try {
            //用户名
            Integer userId = (Integer)request.getAttribute("userId");

            //校验参数：课时表名称不为空
            if (StringUtil.isEmpty(designation)) {
                return new Result(false, null, ErrorMsg.PARAM_NULL);
            }

            //判断课时表名称是否重复
            return classTimeService.designationSame(userId, designation);
        } catch (Exception e) {
            logger.error("判断课时表名称是否重复异常！", e);
            return new Result(false, null, ErrorMsg.SYSTEM_ERROR);
        }
    }
}
